package com.nineclock.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.threadlocal.CurrentUserHolder;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import com.nineclock.system.service.SysCompanyContactConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
@Slf4j
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {


    @Autowired
    SysCompanyContactConfigMapper  companyContactConfigMapper;

    /**
     * 新增 企业通讯录字段
     * @param companyContactConfigDTO
     */
    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO companyContactConfigDTO) {
        //健壮性 判断
        if(companyContactConfigDTO == null || companyContactConfigDTO.getName() == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }

        // 从线程中获取企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //把dto中的数据复制到pojo中
        SysCompanyContactConfig companyContactConfig = BeanHelper.copyProperties(companyContactConfigDTO, SysCompanyContactConfig.class);

        //给其他的属性赋值
        companyContactConfig.setFieldType("String");
        companyContactConfig.setStatus((short)1);
        companyContactConfig.setCompanyId(companyId);

        //新增企业通讯录字段 到 数据库
        companyContactConfigMapper.insert(companyContactConfig);
    }

    /**
     * 查询并初始化
     * 1. 判断是否是 第一次访问(根据企业id查询对应的通讯录字段，如果查不到，说明第一次访问)
     * 2. 第一次访问，初始化
     * 3. 所有的相关字段 返回
     * @return
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompanyContactConfig() {
        // 从线程中获取企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //查询该企业对应的通讯录字段
        LambdaQueryWrapper<SysCompanyContactConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);
        //查询该企业关联的通讯录 数量
        Integer count = companyContactConfigMapper.selectCount(wrapper);
        //如果 为0 ，则初始通讯录
        if(count == 0){
            //初始化 通讯录字段
            for (String name : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
                companyContactConfig.setCompanyId(companyId);
                companyContactConfig.setStatus((short)1);
                companyContactConfig.setFieldType("String");
                companyContactConfig.setType("fixed");
                companyContactConfig.setName(name);

                companyContactConfigMapper.insert(companyContactConfig);
            }
        }

        //查询相关信息并返回
        List<SysCompanyContactConfig> companyContactConfigList = companyContactConfigMapper.selectList(wrapper);
        //复制： 把pojo转换为 dto
        List<SysCompanyContactConfigDTO> companyContactConfigDTOList = BeanHelper.copyWithCollection(companyContactConfigList, SysCompanyContactConfigDTO.class);

        return companyContactConfigDTOList;
    }

    /**
     * 更新企业通讯录状态
     * @param id
     * @param status
     */
    @Override
    public void updateCompanyContactConfig(Long id, Short status) {
        //健壮性判断
        if(id == null || status == null){
            throw new RuntimeException(ResponseEnum.INVALID_PARAM_ERROR.getMessage());
        }
        //根据id查询  对象(从数据库)
        SysCompanyContactConfig companyContactConfig = companyContactConfigMapper.selectById(id);
        if(companyContactConfig == null){
            throw new RuntimeException(ResponseEnum.COMPANY_CONTACT_CONFIG_NOT_EXISTS.getMessage());
        }

        // 更新数据
        companyContactConfig.setStatus(status);

        //更新数据库
        companyContactConfigMapper.updateById(companyContactConfig);
    }
}
